#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define THREAD_COUNT 20000

//初始化互斥锁
static pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;


void *add_thread(void *argv)
{
   
    // 将传入的参数转换为指向整数的指针
    int *p = argv;

    // 加锁:在操作数据前
    pthread_mutex_lock(&mutex_lock);
    
    // 对指针指向的整数进行加1操作
    *p = *p + 1;

    // 解锁:在操作数据后
    pthread_mutex_unlock(&mutex_lock);

    // 线程执行完毕，返回NULL
    return NULL;
}

int main()
{
    pthread_t threads[THREAD_COUNT];

    int num; // 被n个线程进行不断累加的变量

    // 启动20000个线程对num进行累加
    for (int i = 0; i < THREAD_COUNT; i++)
    {
        pthread_create(&threads[i], NULL, add_thread, &num);
    }

    // 等待所有线程执行的结果
    for (int i = 0; i < THREAD_COUNT; i++)
    {
        pthread_join(threads[i], NULL);
    }

    // 打印累加结果 => 会比20000要小一些
    printf("累加结果：%d \n", num);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex_lock);

    return 0;
}

/*
整体功能
这个函数的主要功能是在多线程环境中对一个共享的整数进行加 1 操作。在 main 函数中，通过 pthread_create 函数创建了多个线程，并将同一个整数的地址传递给每个线程。每个线程都会调用 add_thread 函数，对这个共享的整数进行加 1 操作。

潜在问题
由于多个线程可能同时访问和修改同一个共享变量，会出现竞态条件（race condition），导致最终的累加结果可能小于预期值。可以使用互斥锁（mutex）来解决这个问题，确保同一时间只有一个线程可以访问和修改共享变量。
*/